home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / checkbox / frontend.py < prev    next >
Text File  |  2009-11-05  |  3KB  |  91 lines

  1. #
  2. # This file is part of Checkbox.
  3. #
  4. # Copyright 2008 Canonical Ltd.
  5. #
  6. # Checkbox is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # Checkbox is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with Checkbox.  If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. import os
  20. import pwd
  21.  
  22. DBUS_INTERFACE_NAME = "com.ubuntu.checkbox"
  23.  
  24. DBUS_BUS_NAME = "com.ubuntu.checkbox"
  25.  
  26.  
  27. class FrontendException(Exception):
  28.  
  29.     pass
  30.  
  31. class Frontend(object):
  32.  
  33.     globals = {}
  34.  
  35.     def __init__(self, function, method):
  36.         self._function = function
  37.         self._method = method
  38.  
  39.     def __get__(self, instance, cls=None):
  40.         self._instance = instance
  41.         return self
  42.  
  43.     def __call__(self, *args, **kwargs):
  44.         if self.user == "root":
  45.             return self._function(self._instance, *args, **kwargs)
  46.         else:
  47.             return getattr(self, self._method)(*args, **kwargs)
  48.  
  49.     @property
  50.     def user(self):
  51.         uid = os.getuid()
  52.         user = pwd.getpwuid(uid)[0]
  53.         return user
  54.  
  55.     @property
  56.     def client(self):
  57.         import dbus
  58.         import dbus.mainloop.glib
  59.  
  60.         if "client" in self.globals:
  61.             return self.globals["client"]
  62.         else:
  63.             dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  64.             try:
  65.                 bus = dbus.SystemBus()
  66.                 obj = bus.get_object(DBUS_BUS_NAME, '/checkbox')
  67.             except dbus.DBusException:
  68.                 raise FrontendException, "Failed to connect to DBus backend"
  69.  
  70.             client = dbus.Interface(obj, DBUS_INTERFACE_NAME)
  71.  
  72.             return self.globals.setdefault("client", client)
  73.  
  74.     def get_job_result(self, *args, **kwargs):
  75.         if self._instance.user:
  76.             return self.client.get_job_result(self._instance.command)
  77.         else:
  78.             return self._function(self._instance, *args, **kwargs)
  79.  
  80.     def get_registry(self, *args, **kwargs):
  81.         if self._instance.user:
  82.             return self.client.get_registry(self._instance.__module__)
  83.         else:
  84.             return self._function(self._instance, *args, **kwargs)
  85.  
  86.  
  87. def frontend(method):
  88.     def wrapper(func):
  89.         return Frontend(func, method)
  90.     return wrapper
  91.